//
// Created by 1065246 on 2023/7/28.
//

#include <iostream>
using namespace std;

class CopyDemo{
public:
    CopyDemo():num(new int(0)){
        cout<<"construct!"<<endl;
    }
    //拷贝构造函数
    CopyDemo(const CopyDemo &d):num(new int(*d.num)){
        cout<<"copy construct!"<<endl;
    }
    //添加移动构造函数
   /* CopyDemo(CopyDemo &&d):num(d.num){
        d.num = NULL;
        cout<<"move construct!"<<endl;
    }*/
    ~CopyDemo(){
        cout<<"class destruct!"<<endl;
    }

public:
    int *num;
};

void doWork(CopyDemo copyDemo){
    cout<<"doWork start!"<<copyDemo.num<<endl;
}

CopyDemo get_demo(){
    //以【值传递】的方式返回局部对象
    return CopyDemo();
}

int main(){
    CopyDemo a;
    //拷贝构造调用方式1:以已创建的对象初始化新对象
    CopyDemo b=a;
    CopyDemo c(a);

    //下面的方式不会调用拷贝构造
    CopyDemo d;
    d=a;
    //拷贝构造调用方式2:以【值传递】的方式传参给函数的形参
    doWork(c);
    //拷贝构造调用方式2:以【值传递】的方式返回局部对象
    CopyDemo a1 = get_demo();
    //在 Linux 上使用g++ demo.cpp -fno-elide-constructors命令运行,禁止编译器优化
    //construct!                <-- 执行 demo()
    //copy construct!       <-- 执行 return demo()
    //class destruct!         <-- 销毁 demo() 产生的匿名对象
    //copy construct!       <-- 执行 a = get_demo()
    //class destruct!         <-- 销毁 get_demo() 返回的临时对象
    //class destruct!         <-- 销毁 a
    return 0;
}